//
//  DFUserAccountViewModel.swift
//  新浪微博
//
//  Created by dafei on 16/5/23.
//  Copyright © 2016年 itheima. All rights reserved.
//
// 用户的视图模型:
// 封装网络请求
// 储存用户数据
// 对外提供本地缓存的用户的数据



import UIKit

private let userInforKey = "com.baidu.userInfoKey"

class DFUserAccountViewModel: NSObject {
    
    //单例对象  伪单例
    static let sharedAccountViewModel: DFUserAccountViewModel = DFUserAccountViewModel()
    var userAccount : DFUserAccount?
    //重写构造方法 在构造方法中 加载用户的账户模型
    //如何让构造方法之调用一次 ==>使用单例对象
    private override init() {
        super.init()
        userAccount = loadUserAccount()
        
    }
    
    //通过判断用户是否登录的计算s属性 来解决每次都需要判断的问题
    //计算型属性 每次调用都会执行
    var userLogin: Bool {
        
        //拿到时间后做比较 如果是降续为对的
        //OrderedDescending 降续
        if userAccount?.expires_date?.compare(NSDate()) == .OrderedDescending {
            return true
        }
    //如果过期  需要将userAccount 设置为nil
        userAccount = nil
        return false
    }
   
    //增加一个用户头像地址 纯种nsurl地址
    //只读属性 特点:每次执行都会进行计算
    var headURL: NSURL? {
        get {
            return NSURL(string: userAccount?.avatar_large ?? "")
        
        }
    
    }

}

extension DFUserAccountViewModel {
    //使用code 加载用户授权的token
    
    func loadAccessToken(code: String, finished:(isSuccess: Bool) -> ()){
    
        HMNetworkTools.sharedTools.loadAccessToken(code) { (responseObject, error) in
            print(responseObject,error)
            //请求token成功之后 使用token 和 uid信息
            if error != nil {
            
            finished (isSuccess: false)
                return
            }
            //请求成功
        self.loaduserInfo(responseObject, finished: finished)
        }
   
    }
    //请求用户信息
    private func loaduserInfo(response : AnyObject?,finished:(isSuccess: Bool) ->()){
    
          //尝试将AnyObject? 类型的response 转换为 字典类型 如果转换不成功 就返回失败
        guard let result = response as? [String: AnyObject] else {
  
            finished(isSuccess: false)
            return
        }
    
        HMNetworkTools.sharedTools.loaduserInfo(result) { (responseObject, error) in
            if error != nil {
                finished(isSuccess: false)
                return
            }
            //请求成功
            guard var dict = responseObject as? [String: AnyObject] else {
                finished(isSuccess: false)
                return
            }
            
            //用户信息应该保存到用户信息本地
            //合并字典 统一保存用户数据到本地
            for (key, value) in result {
                
                dict[key] = value
                
            }
            
            //这段代码被移动到 分类中进行封装
            self.saveUserAccount(dict)
            //完成后成功回调
            finished(isSuccess: true)
            
        }
   
    }
    
}

//存取数据
extension DFUserAccountViewModel {
    
       //存储数据
       func saveUserAccount(dict: [String : AnyObject]) {
    
        //将字典转为模型对象
        let user = DFUserAccount(dict: dict)
        //为了解决从未登陆状态 -> 登陆状态userAccount 为nil 的bug
        self.userAccount = user
        //将模型转为字典
        let keys = ["access_token","expires_in","uid","name","avatar_large","expires_date"]
        let userInfo = user.dictionaryWithValuesForKeys(keys)
        print(userInfo)
        //用偏好设置保存字典数据
        let userDefaults = NSUserDefaults.standardUserDefaults()
        userDefaults.setObject(userInfo, forKey: userInforKey)
        //同步
        userDefaults.synchronize()
        print(NSHomeDirectory())
        
    }
       // 获取数据  减少这个方法调用 希望只执行一次
        func loadUserAccount() -> DFUserAccount? {
            //如果使用as! 在偏好设置并没有保存数据的时候  程序会崩溃
            //频繁读取磁盘中数据 磁盘IO 性能不高 并且影响磁盘的寿命
            guard let dict = NSUserDefaults.standardUserDefaults().objectForKey(userInforKey) as? [String: AnyObject] else {
                //防止没有数据时 程序崩溃
                return nil
           }
            
            //字典转模型
            //再次判断用户的token 是否过期
            return DFUserAccount(dict: dict)
            
        
        }

}














